/*
自定义通用接口调用文件
*/
import axios from 'axios'
// 导入路由对象
import router from '@/router/index.js'

// 导入第三方包 处理id最大值
const JSONbig = require('json-bigint')

// 导出基准路径
export const baseURL = 'http://api-toutiao-web.itheima.net/mp/v1_0/'
// 设置axios的基准路径
axios.defaults.baseURL = baseURL

// 配置请求拦截器
axios.interceptors.request.use(config => {
  // 如果不是登录页 都需要加请求头
  if (config.url !== 'authorizations') {
    config.headers.Authorization = 'Bearer ' + localStorage.getItem('mytoken')
  }
  return config
}, (err) => {
  // 如果上述函数出错了  就触发这个进行报错
  return Promise.reject(err)
})

// 专门处理返回的数据格式
axios.defaults.transformResponse = [(data) => {
  // 参数data 表示后端返回的数据
  // 删除成功后 后端有返回数据吗？ 没有
  try {
    return JSONbig.parse(data)
  } catch (error) {
    // 如果返回的数据无法转换为正常的数据 就返回原始内容
    console.log(error)
    return data
  }
}]

// 配置响应拦截器 （通过调用接口获取数据之前先经过响应拦截器 可对数据进行一些处理）
axios.interceptors.response.use(response => {
  // 这里如果返回的是response.data
  // 那么我们调用接口得到的数据就是这里返回的数据
  return response.data
}, (err) => {
  // 如果token失效了 那么后端返回401 这里就会触发， 先删除旧token再跳转到登录页
  if (err.response.status === 401) {
    localStorage.removeItem('mytoken')
    router.push('/login')
    // 终止后续代码执行
    return
  }
  // 抛出错误
  return Promise.reject(err)
})

// 封装接口通用方法
const request = (options) => {
  return axios({
    // 请求方式
    method: options.method,
    // 请求地址
    url: options.url,
    data: options.data,
    // 请求头
    headers: options.headers,
    // get方式请求参数
    params: options.params
  })
}
// 调用
// request({
//     method:'get',
//     url:'user/profile'
// })

// 导出
export default request
